package com.itheima.w_util;

import java.util.Arrays;
import java.util.Map;   
import java.util.Optional;   
import java.util.concurrent.ConcurrentHashMap;   
import java.util.function.Function;   
import java.util.stream.Collectors;
   
public class EnumFindUtils {
    
    /**
     * 根据枚举的属性值查找枚举
     *
     * @param enumClass 枚举类
     * @param attributeValue 属性值
     * @param attributeExtractor 属性提取函数
     * @param <E> 枚举类型
     * @param <A> 属性类型
     * @return 匹配的枚举值，如果找不到返回Optional.empty()
     */
    public static <E extends Enum<E>, A> Optional<E> findByAttribute(
            Class<E> enumClass,
            A attributeValue,
            Function<E, A> attributeExtractor) {
        
        return Arrays.stream(enumClass.getEnumConstants())
                .filter(e -> {
                    A value = attributeExtractor.apply(e);
                    return value != null && value.equals(attributeValue);
                })
                .findFirst();
    }
    
    /**
     * 带缓存的查找方法，适用于频繁查找的场景
     *
     * @param enumClass 枚举类
     * @param attributeValue 属性值
     * @param attributeExtractor 属性提取函数
     * @param <E> 枚举类型
     * @param <A> 属性类型
     * @return 匹配的枚举值，如果找不到返回Optional.empty()
     */
    private static final Map<Class<?>, Map<Object, Enum<?>>> CACHE = new ConcurrentHashMap<>();
    
    public static <E extends Enum<E>, A> Optional<E> findByAttributeWithCache(
            Class<E> enumClass,
            A attributeValue,
            Function<E, A> attributeExtractor) {
        
        // 获取或创建该枚举类的缓存
        Map<Object, Enum<?>> enumCache = CACHE.computeIfAbsent(enumClass, k ->
                Arrays.stream(enumClass.getEnumConstants())
                        .collect(Collectors.toMap(
                                attributeExtractor,
                                e -> e,
                                (e1, e2) -> e1)));
        
        @SuppressWarnings("unchecked")
        E result = (E) enumCache.get(attributeValue);
        return Optional.ofNullable(result);
    }   
}
